<?php
/**
 * 项目环境初始化
 *
 * @version $Id$
 */

// 输出头部编码信息，不过貌似放在这不太合适
header('Content-type: text/html; charset=utf-8');

// 输出头部，所有页面都不缓存，每次都200，或由服务器输出304
// header('Cache-Control: no-cache, must-revalidate');

// 初始化时区
date_default_timezone_set('Asia/Shanghai');

// 定义一些初始化的变量 (全局系统变量，大写)
$CORE = array(
	'class' => array(),
	'config' => array(),
	'env' => array(),
);



/** 定义基础函数 */

/**
 *	获取 Lib
 * @param <string> $className
 */
function loadLib($className , $initClass = false) {
	return loadClass($className , 'lib' , $initClass);
}
/**
 * 获取 Include
 * @param <string> $className
 */
function loadInclude($className , $initClass = false) {
	return loadClass($className , 'include' , $initClass);
}

/**
 *	获取 Smarty
 * @param <string> $className
 */
function loadSmarty() {
	if(empty($GLOBALS['CORE']['class']['Smarty'])) {
		require_once( ROOT_PATH . '/lib/Smarty/Smarty.class.php');
		$smarty = new Smarty;
		$smarty->compile_check = true;
		$smarty->debugging = false;
		$smarty->caching = false;
		$smarty->template_dir = ADMIN_PATH . '/tpl/';
		$smarty->compile_dir = ADMIN_PATH . '/tpl_cache/';
		$smarty->use_sub_dirs = true;
		$smarty->left_delimiter = '[##';
		$smarty->right_delimiter = '##]';
		
		// 初始化公用模板变量
		$smarty->assign('siteurl' , SITEURL);
		$smarty->assign('phonenurl' , ADMINURL);

		// 注册模板需要的函数
		loadLib('Format');
		$smarty->registerPlugin('modifier' , 'formatTime' , 'Format::time');
		$smarty->registerPlugin('modifier' , 'Pager' , 'View::Pager');
		
		$GLOBALS['CORE']['class']['Smarty'] = $smarty;
	}
	return $GLOBALS['CORE']['class']['Smarty'];
}


/**
 * 获取class，并初始化
 * @param <string> $className
 * @param <string> $type
 * @param <boolean> $initClass 是否需要 new 类。如果有 new 类的话，函数会返回实例。否则返回 true
 */
function loadClass($className , $type , $initClass = false) {
	// 判断类是否已加载过
	if( isset($GLOBALS['CORE']['class'][$className]) ) return $GLOBALS['CORE']['class'][$className];

	switch($type) {
		case 'lib' : $dir = '/lib/'; break;
		case 'include' : $dir = '/include/'; break;
		default : die('<wml><card title="Error">Wrong ClassName [' . $className . '].</card></wml>');
	}
	
	$classNamePath = str_replace('_' , '/' , $className);

	$classFile = ROOT_PATH . $dir . $classNamePath . '.php';

	if(!file_exists($classFile)) die('<wml><card title="Error">Wrong ClassName [' . $dir . $classNamePath . '.php].</card></wml>');

	require_once($classFile);

	// 检查类是否存在
	if(!class_exists($className)) die('<wml><card title="Error">Wrong ClassName [' . $dir . $className . '].</card></wml>');

	$GLOBALS['CORE']['class'][$className] = true;

	// 如果不是静态方法，则 new 类
	if($initClass) {
		$GLOBALS['CORE']['class'][$className] = new $className();
	}

	return $GLOBALS['CORE']['class'][$className];
}

function getConfig($name) {
	$config = isset($GLOBALS['CORE']['config'][$name]) ? $GLOBALS['CORE']['config'][$name] : null;
	return $config;
}


/** 包含基础公用文件 */
// loadLib('Common' , false);

/**
 * 系统启动函数
 *	通过 url 传递的参数，判断需要加载哪个 Module
 *	先通过简单的获取 $_GET 方式获取对应 Module 和 Action，以后有需要，重写这一段
 *
 * 准备类以及全局变量
 */
function PREPARE() {
	/** 初始化DB */
	loadLib('Db');
	$GLOBALS['CORE']['class']['Db'] = new Db(DB_HOST , DB_USER , DB_PASSWORD , DB_NAME);
	$GLOBALS['CORE']['class']['Db']->connect();
	
	/** 初始化User类 */
	// loadLib('User');
	// $GLOBALS['CORE']['class']['User'] = new User();
	
	/** 基础类库 */
	loadLib('View');
	loadLib('Format');
	
	loadLib('Session' , true);

	/** 路由开始 */
	$module_name = isset($_GET['m']) ? preg_replace('/[^a-zA-Z0-9_]/' , '' , $_GET['m']) : 'index';
	$action_name = isset($_GET['a']) ? preg_replace('/[^a-zA-Z0-9_]/' , '' , $_GET['a']) : 'index';
	
	// 设置环境变量
	$GLOBALS['CORE']['env']['module'] = $module_name;
	$GLOBALS['CORE']['env']['action'] = $action_name;
}

/**
 * 系统启动函数
 */
function RUN() {
	// 判断 module 目录
	$module_dir = ADMIN_PATH . '/module/';
	
	// 判断文件是否存在
	$module_file = $module_dir . str_replace('_' , '/' , $GLOBALS['CORE']['env']['module']) . '.module.php';
	if(!file_exists($module_file)) {
		die('module file not exists.');
	}

	require_once($module_file);

	$module_class = 'Module_' . $GLOBALS['CORE']['env']['module'];

	// 执行
	$module = new $module_class();
	$output = $module->$GLOBALS['CORE']['env']['action']();
	
	echo $output;
}

# end of script
